“Baby Mental Life: Study 2” was conducted on MTurk on 2018-08-04.

Our planned sample was 300 participants, and we anticipated that roughly 80% of recruited participants would pass all of our attention checks, so we initially recruited 378 participants (on the idea that ~80% of 378 ~ 300 participants; note that for administrative purposes we need to recuit participants in batches that were divisible by 9). After filtering out participants who failed at least one of our attention checks, we ended up retaining fewer than 300 participants, so we recruited an additional 16 participants for a total of 394 people recruited. At each stage, we recruited women and men through separate studies, in hopes of acquiring a roughly equal split between genders.

In the end, we ended up with a sample of 304 participants who passed our attention checks, 237 of whom came from unique GPS coordinates.

For this first pass, these data INCLUDE participants where there is another participant with an identical set of GPS coordinates as recorded by Qualtrics. Excluding these participants would exclude 67 participants.

Each participant assessed children’s mental capacities at 13 target ages between the ages of 0 and 5 years. For each target, they rated 20 mental capacities on a scale from 0 (not at all capable) to 100 (completely capable).

For more details about the study, see our preregistration here.

NAs introduced by coercionattributes are not identical across measure variables;
they will be droppedJoining, by = "question_qualtrics"

Study 1 EFA

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

EFA

To test H1, we planned to conduct an exploratory factor analysis (EFA) collapsing across all 13 target characters (and treating an individual participant’s responses to each character as if they were independent data points) - see the preregistration for more details.

As with Study 1, we planned to examine three factor retention protocols in order to determine how many factors to retain: Parallel analysis, minimizing BIC, and a set of preset criteria outlined in Weisman et al. (2017). Here we look at each solution in turn.

We predicted that we’d see a similar factor structure to that found in Study 1.

Rotation choices

We planned to examine oblimin-rotated solutions (which allow factors to correlate), but you could examine other rotation options by selecting a different rotation type here.

Parallel analysis

How many factors to retain?

Parallel analysis suggests that the number of factors =  4  and the number of components =  4 
Call: fa.parallel(x = d_all, plot = F)
Parallel analysis suggests that the number of factors =  4  and the number of components =  4 

 Eigen Values of 

What are these factors?

Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

These factors look extremely similar to what we saw in Study 1 (see above). I (Kara) would say that H1 is strongly supported.

Which capacities are attributed to which targets?

We could look at factor scores using the Study 2 EFA to see which capacities were attributed to which targets. This is not the primary way we planned to investigate this - this was listed as a “follow-up analysis” - but I’m putting it here so that it’s in close proximity to the EFA results for ease of interpretation.

Age as numeric (raw)

Ignoring unknown aesthetics: y

Age as numeric (square-root-transformed)

Ignoring unknown aesthetics: y

Age as ordinal

Ignoring unknown aesthetics: y

And here’s a close look at all of the raw data (color-coded according to the Study 2 EFA results):

Joining, by = "capacity"

|==================================                               | 53% ~2 s remaining     
|===================================                              | 54% ~2 s remaining     
|====================================                             | 55% ~2 s remaining     
|=====================================                            | 58% ~2 s remaining     
|======================================                           | 60% ~2 s remaining     
|=======================================                          | 61% ~2 s remaining     
|========================================                         | 62% ~1 s remaining     
|=========================================                        | 63% ~1 s remaining     
|==========================================                       | 65% ~1 s remaining     
|===========================================                      | 67% ~1 s remaining     
|============================================                     | 68% ~1 s remaining     
|============================================                     | 69% ~1 s remaining     
|==============================================                   | 71% ~1 s remaining     
|===============================================                  | 73% ~1 s remaining     
|================================================                 | 74% ~1 s remaining     
|=================================================                | 76% ~1 s remaining     
|==================================================               | 77% ~1 s remaining     
|===================================================              | 78% ~1 s remaining     
|====================================================             | 80% ~1 s remaining     
|=====================================================            | 82% ~1 s remaining     
|======================================================           | 84% ~1 s remaining     
|=======================================================          | 85% ~1 s remaining     
|========================================================         | 87% ~0 s remaining     
|=========================================================        | 88% ~0 s remaining     
|==========================================================       | 90% ~0 s remaining     
|===========================================================      | 92% ~0 s remaining     
|===========================================================      | 92% ~0 s remaining     
|============================================================     | 93% ~0 s remaining     
|=============================================================    | 95% ~0 s remaining     
|===============================================================  | 97% ~0 s remaining     
|================================================================ | 99% ~0 s remaining     
Joining, by = c("capacity", "factor", "order")

Joining, by = "capacity"

Minimizing BIC

How many factors to retain?


Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.85  with  1  factors
VSS complexity 2 achieves a maximimum of 0.96  with  2  factors

The Velicer MAP achieves a minimum of 0.02  with  4  factors 
BIC achieves a minimum of  -153.95  with  8  factors
Sample Size adjusted BIC achieves a minimum of  30.35  with  8  factors

Statistics by number of factors 

What are these factors?

convergence not obtained in GPFoblq. 1000 iterations used.
Joining, by = "capacity"
Joining, by = "factor"
Joining, by = "factor"

A more complex picture, but the first 4 factors look similar to what we get through parallel analysis. (I think something similar happened with Study 1, but we should go back and compare.)

Which capacities are attributed to which targets?

Ignoring unknown aesthetics: y

We’ll skip regression analyses and other plots for now.

Preset retention criteria

How many factors to retain?

[1] "Preset criteria suggest retaining 4 factors"

This gives the same solution as parallel analysis - 4 factors :)

Projecting into Study 1 factor space

I (Kara) made a big mistake in thinking through this: I thought we could project a 20-variable dataset into a 60-variable dataset using the predict.psych() function, but we can’t!

I’ve tried to hack together a way to do this, by replacing all missing values at random (either within the full range of the scale, or around the midpoint, or near 0) - but I haven’t gotten anything to work. As you can see below (replacing missing values at random between 0-5), you see slight increases across all factors, and the most dramatic increase for Factor 4 - but I think this is because that factor is least well-defined in the Study 1 EFA solution? I think we need to focus on analyzing factor scores from our Study 2 EFA. I’m sorry for this mistake!

Regression models in Study 2 factor space

Here’s a multilevel linear regression on these factor scores, with random intercepts and slopes (for target and factor) by participant. Target is coded as numeric, with only the linear contrast.

If we try to run the model above (our planned analysis), we get an error: “Model is nearly unidentifiable: very large eigenvalue.” The error suggests rescaling variables, which solves the problem. Here I’ve re-scaled by divided age in months by 12, to get age in years. Let’s make sure to talk about this.

Model failed to converge with max|grad| = 0.0388135 (tol = 0.002, component 1)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ target_num * factor + (target_num + factor | ResponseId)
   Data: efa_all_par_scores %>% mutate(target_num = target_num/12)

REML criterion at convergence: 26763.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-7.6050 -0.4547  0.0520  0.5209  4.4723 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 0.37568  0.6129                          
            target_num  0.01556  0.1247   -0.62                  
            factor1     0.18389  0.4288    0.48 -0.35            
            factor2     0.28874  0.5373   -0.53  0.22 -0.42      
            factor3     0.30777  0.5548    0.20  0.27 -0.11 -0.69
 Residual               0.24496  0.4949                          
Number of obs: 15808, groups:  ResponseId, 304

Fixed effects:
                    Estimate Std. Error t value
(Intercept)        -0.369926   0.035549 -10.406
target_num          0.262153   0.007578  34.594
factor1             0.080138   0.026242   3.054
factor2            -0.277623   0.032148  -8.636
factor3             0.263423   0.033108   7.957
target_num:factor1 -0.056791   0.004324 -13.134
target_num:factor2  0.196741   0.004324  45.499
target_num:factor3 -0.186678   0.004324 -43.172
convergence code: 0
Model failed to converge with max|grad| = 0.0388135 (tol = 0.002, component 1)

As we predicted (H2), we see dramatic increases in mental capacity attributions across the age range (main effect of target_num).

And also as we predicted (H1), we see differences across factors in where newborns are perceived to start off: Relative to the grand mean, newborns are perceived to start off with more “negative emotions” (distress, frustration, etc.; main effect of factor1), less/fewer capacities in the domain of “cognition and control” (emotional control, self control, etc.; main effect of factor2), and relatively more “bodily sensations” (pain, fatigue, etc.; main effect of factor3). (We could recode this to look at factor4, or just eyeball it from the plot.) Also as predicted, we see that the perceived changes across age vary dramatically across factors: “negative emotions” are perceived to change relatively less over development, “cognition and control” are perceived to change much more over development, and “bodily sensations” are predicted to chagne relatively less.

This is all very much in line with our preregistered hypotheses :)

Now let’s see what the polynomial effects look like (again, looking at age in years instead of months). As we expected, including all of the polynomial effects as random slopes caused the model not to converge (I think we must be calculating df wrong), so I implemented our preregistered remedy and included only the linear effect as a random slope.

Model failed to converge with max|grad| = 0.254176 (tol = 0.002, component 1)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ poly(target_num, 3) * factor + (poly(target_num, 1) +  
    factor | ResponseId)
   Data: efa_all_par_scores %>% mutate(target_num = target_num/12)

REML criterion at convergence: 23281.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-8.4081 -0.4919  0.0056  0.5500  4.9585 

Random effects:
 Groups     Name                Variance Std.Dev. Corr                   
 ResponseId (Intercept)           0.2762  0.5255                         
            poly(target_num, 1) 623.6907 24.9738  -0.41                  
            factor1               0.1875  0.4330   0.44 -0.35            
            factor2               0.2929  0.5412  -0.54  0.23 -0.43      
            factor3               0.3081  0.5550   0.32  0.25 -0.11 -0.69
 Residual                         0.1928  0.4391                         
Number of obs: 15808, groups:  ResponseId, 304

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                   5.449e-14  3.034e-02   0.000
poly(target_num, 3)1          5.197e+01  1.498e+00  34.691
poly(target_num, 3)2         -2.111e+01  4.391e-01 -48.082
poly(target_num, 3)3          9.471e+00  4.391e-01  21.570
factor1                       4.083e-14  2.556e-02   0.000
factor2                      -3.362e-14  3.162e-02   0.000
factor3                      -3.642e-14  3.240e-02   0.000
poly(target_num, 3)1:factor1 -1.126e+01  7.605e-01 -14.804
poly(target_num, 3)2:factor1  3.958e+00  7.605e-01   5.204
poly(target_num, 3)3:factor1 -2.147e+00  7.605e-01  -2.823
poly(target_num, 3)1:factor2  3.900e+01  7.605e-01  51.285
poly(target_num, 3)2:factor2  2.110e+00  7.605e-01   2.774
poly(target_num, 3)3:factor2 -6.915e+00  7.605e-01  -9.092
poly(target_num, 3)1:factor3 -3.701e+01  7.605e-01 -48.661
poly(target_num, 3)2:factor3  1.306e+01  7.605e-01  17.168
poly(target_num, 3)3:factor3 -5.433e+00  7.605e-01  -7.143

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
    vcov(x)        if you need it
convergence code: 0
Model failed to converge with max|grad| = 0.254176 (tol = 0.002, component 1)

Lots to sift through here, but in general we see that the effect of target age on mental capacity attributions definitely has linear, quadratic, and cubic components, all three of which seem to vary substantially across factors. Pretty much all of these differences are “significant” (if you consider |t| > 2 to be “significant”) - for interpretation, I would need to look closer at the plot. Let’s pull it up again here, with blue lines approximating the formula y ~ poly(x, 3):

Ignoring unknown aesthetics: y

We can talk through these interpretations together - but I find the difference between Factor 2 (“cognition & control”) and Factor 4 (“positive emotions”) to be especially interesting!

Demographics

Factor `Education` contains implicit NA, consider using `forcats::fct_explicit_na`

Factor `Income` contains implicit NA, consider using `forcats::fct_explicit_na`

Factor `Parent` contains implicit NA, consider using `forcats::fct_explicit_na`

Planning for S3 prereg

Joining, by = "capacity"
Column `capacity` joining character vector and factor, coercing into character vectorJoining, by = "capacity"
unable to evaluate scaled gradientModel failed to converge: degenerate  Hessian with 2 negative eigenvalues
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ target_num * domain + (target_num + domain | ResponseId) +  
    (target_num | capacity)
   Data: d_temp_culled %>% mutate(target_num = target_num/12)

REML criterion at convergence: 276393.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.5989 -0.4572  0.0289  0.5102  5.4326 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 242.05   15.558                          
            target_num   11.99    3.462   -0.58                  
            domain1     115.42   10.743   -0.48  0.49            
            domain2     198.33   14.083   -0.28  0.15 -0.43      
            domain3     202.84   14.242    0.58 -0.32 -0.21 -0.58
 capacity   (Intercept) 454.81   21.326                          
            target_num  315.86   17.773   -0.17                  
 Residual               320.25   17.896                          
Number of obs: 31616, groups:  ResponseId, 304; capacity, 8

Fixed effects:
                   Estimate Std. Error t value
(Intercept)          57.758      7.594   7.606
target_num            7.579      6.287   1.206
domain1              33.744     13.076   2.581
domain2             -45.589     13.087  -3.484
domain3               7.296     13.087   0.557
target_num:domain1   -6.308     10.884  -0.580
target_num:domain2    6.709     10.884   0.616
target_num:domain3   -1.445     10.884  -0.133
convergence code: 0
unable to evaluate scaled gradient
Model failed to converge: degenerate  Hessian with 2 negative eigenvalues
Model failed to converge with max|grad| = 0.0296471 (tol = 0.002, component 1)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ target_num * domain + (target_num + domain | ResponseId) +  
    (1 | capacity)
   Data: d_temp_culled %>% mutate(target_num = target_num/12)

REML criterion at convergence: 276844.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.5281 -0.4507  0.0443  0.5053  5.4042 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 241.25   15.532                          
            target_num   11.99    3.463   -0.58                  
            domain1     115.76   10.759   -0.48  0.49            
            domain2     199.04   14.108   -0.28  0.15 -0.44      
            domain3     202.81   14.241    0.58 -0.32 -0.21 -0.57
 capacity   (Intercept)  50.80    7.127                          
 Residual               325.55   18.043                          
Number of obs: 31616, groups:  ResponseId, 304; capacity, 8

Fixed effects:
                   Estimate Std. Error t value
(Intercept)         57.7579     2.6762  21.582
target_num           7.5794     0.2088  36.302
domain1             33.7440     4.4143   7.644
domain2            -45.5894     4.4452 -10.256
domain3              7.2957     4.4466   1.641
target_num:domain1  -6.3077     0.1115 -56.590
target_num:domain2   6.7086     0.1115  60.186
target_num:domain3  -1.4450     0.1115 -12.963
convergence code: 0
Model failed to converge with max|grad| = 0.0296471 (tol = 0.002, component 1)
Linear mixed model fit by REML ['lmerMod']
Formula: score ~ target_num * domain + (target_num | ResponseId)
   Data: d_temp_culled %>% mutate(target_num = target_num/12) %>% group_by(domain,  
    target_num, ResponseId) %>% summarise(score = mean(response,  
    na.rm = T)) %>% ungroup() %>% distinct()

REML criterion at convergence: 138809.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.7636 -0.5695  0.0200  0.6602  4.9951 

Random effects:
 Groups     Name        Variance Std.Dev. Corr 
 ResponseId (Intercept) 234.89   15.326        
            target_num   10.57    3.251   -0.58
 Residual               347.42   18.639        
Number of obs: 15808, groups:  ResponseId, 304

Fixed effects:
                   Estimate Std. Error  t value
(Intercept)         57.7579     0.9013   64.086
target_num           7.5794     0.2088   36.298
domain1             33.7440     0.3446   97.928
domain2            -45.5894     0.3446 -132.304
domain3              7.2957     0.3446   21.173
target_num:domain1  -6.3077     0.1628  -38.735
target_num:domain2   6.7086     0.1628   41.197
target_num:domain3  -1.4450     0.1628   -8.873

Export data

(remember to move prior to pushing to github!)

additional cleaning of raw data

LS0tCnRpdGxlOiAiQmFieSBNZW50YWwgTGlmZTogU3R1ZHkgMiIKc3VidGl0bGU6ICJQcmVyZWdpc3RlcmVkIGFuYWx5c2VzIgpkYXRlOiAyMDE5LTA1LTE1Cm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNjcsIGluY2x1ZGUgPSBULCBlY2hvID0gRikKYGBgCgoiQmFieSBNZW50YWwgTGlmZTogU3R1ZHkgMiIgd2FzIGNvbmR1Y3RlZCBvbiBNVHVyayBvbiAyMDE4LTA4LTA0LgoKT3VyIHBsYW5uZWQgc2FtcGxlIHdhcyAzMDAgcGFydGljaXBhbnRzLCBhbmQgd2UgYW50aWNpcGF0ZWQgdGhhdCByb3VnaGx5IDgwJSBvZiByZWNydWl0ZWQgcGFydGljaXBhbnRzIHdvdWxkIHBhc3MgYWxsIG9mIG91ciBhdHRlbnRpb24gY2hlY2tzLCBzbyB3ZSBpbml0aWFsbHkgcmVjcnVpdGVkIDM3OCBwYXJ0aWNpcGFudHMgKG9uIHRoZSBpZGVhIHRoYXQgfjgwJSBvZiAzNzggfiAzMDAgcGFydGljaXBhbnRzOyBub3RlIHRoYXQgZm9yIGFkbWluaXN0cmF0aXZlIHB1cnBvc2VzIHdlIG5lZWQgdG8gcmVjdWl0IHBhcnRpY2lwYW50cyBpbiBiYXRjaGVzIHRoYXQgd2VyZSBkaXZpc2libGUgYnkgOSkuIEFmdGVyIGZpbHRlcmluZyBvdXQgcGFydGljaXBhbnRzIHdobyBmYWlsZWQgYXQgbGVhc3Qgb25lIG9mIG91ciBhdHRlbnRpb24gY2hlY2tzLCB3ZSBlbmRlZCB1cCByZXRhaW5pbmcgZmV3ZXIgdGhhbiAzMDAgcGFydGljaXBhbnRzLCBzbyB3ZSByZWNydWl0ZWQgYW4gYWRkaXRpb25hbCAxNiBwYXJ0aWNpcGFudHMgZm9yIGEgdG90YWwgb2YgMzk0IHBlb3BsZSByZWNydWl0ZWQuIEF0IGVhY2ggc3RhZ2UsIHdlIHJlY3J1aXRlZCB3b21lbiBhbmQgbWVuIHRocm91Z2ggc2VwYXJhdGUgc3R1ZGllcywgaW4gaG9wZXMgb2YgYWNxdWlyaW5nIGEgcm91Z2hseSBlcXVhbCBzcGxpdCBiZXR3ZWVuIGdlbmRlcnMuCgpJbiB0aGUgZW5kLCB3ZSBlbmRlZCB1cCB3aXRoIGEgc2FtcGxlIG9mIDMwNCBwYXJ0aWNpcGFudHMgd2hvIHBhc3NlZCBvdXIgYXR0ZW50aW9uIGNoZWNrcywgMjM3IG9mIHdob20gY2FtZSBmcm9tIHVuaXF1ZSBHUFMgY29vcmRpbmF0ZXMuCgoqKkZvciB0aGlzIGZpcnN0IHBhc3MsIHRoZXNlIGRhdGEgX0lOQ0xVREVfIHBhcnRpY2lwYW50cyB3aGVyZSB0aGVyZSBpcyBhbm90aGVyIHBhcnRpY2lwYW50IHdpdGggYW4gaWRlbnRpY2FsIHNldCBvZiBHUFMgY29vcmRpbmF0ZXMgYXMgcmVjb3JkZWQgYnkgUXVhbHRyaWNzLiBFeGNsdWRpbmcgdGhlc2UgcGFydGljaXBhbnRzIHdvdWxkIGV4Y2x1ZGUgNjcgcGFydGljaXBhbnRzLioqCgpFYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIGNoaWxkcmVuJ3MgbWVudGFsIGNhcGFjaXRpZXMgYXQgMTMgdGFyZ2V0IGFnZXMgYmV0d2VlbiB0aGUgYWdlcyBvZiAwIGFuZCA1IHllYXJzLiBGb3IgZWFjaCB0YXJnZXQsIHRoZXkgcmF0ZWQgMjAgbWVudGFsIGNhcGFjaXRpZXMgb24gYSBzY2FsZSBmcm9tIDAgKG5vdCBhdCBhbGwgY2FwYWJsZSkgdG8gMTAwIChjb21wbGV0ZWx5IGNhcGFibGUpLiAKCkZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhlIHN0dWR5LCBzZWUgb3VyIHByZXJlZ2lzdHJhdGlvbiBbaGVyZV0oaHR0cHM6Ly9vc2YuaW8vajcyZGcvKS4gCgpgYGB7cn0KIyBsb2FkIHJlcXVpcmVkIGxpYnJhcmllcwpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShsYW5nY29nKSAjIHNvdXJjZTogaHR0cHM6Ly9naXRodWIuY29tL2xhbmdjb2cvbGFuZ2NvZy1wYWNrYWdlCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkobG1lNCkKCiMgc2V0IHRoZW1lIGZvciBnZ3Bsb3RzCnRoZW1lX3NldCh0aGVtZV9idygpKQoKY2hvc2VuX3JvdCA8LSAib2JsaW1pbiIKYGBgCgpgYGB7cn0KIyBydW4gc291cmNlIGNvZGUgKGV4dHJhIGhvbWUtbWFkZSBmdW5jdGlvbnMpCnNvdXJjZSgiLi9zY3JpcHRzL21heF9mYWN0b3JzX2VmYS5SIikKc291cmNlKCIuL3NjcmlwdHMvcGxvdF9mdW4uUiIpCnNvdXJjZSgiLi9zY3JpcHRzL3JldGVuX2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvZGF0YV9wcmVwLlIiKQpgYGAKCgojIFN0dWR5IDEgRUZBCgpgYGB7cn0KIyBsb2FkIGluIEVGQSByZXN1bHRzIGZyb20gc3R1ZHkgMQplZmFfUzEgPC0gcmVhZFJEUygifi9EZXNrdG9wL0JBQklFUy9iYWJ5X21lbnRhbF9saWZlL2RhdGEvc2NvcmVkX2RhdGEvczFfZWZhLnJkcyIpCgojZWZhX1MxIDwtIHJlYWRSRFMoIi4uL3N0dWR5IDEvczFfZWZhLnJkcyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjV9CmhlYXRtYXBfZnVuKGVmYV9TMSkgKyAKICBsYWJzKAogICAgdGl0bGUgPSBwYXN0ZTAoIlNUVURZIDEgUGFyYWxsZWwgQW5hbHlzaXMgKHJvdGF0aW9uOiAiLCBjaG9zZW5fcm90LCAiKSIpLAogICAgc3VidGl0bGUgPSAiJyUgdmFyLicgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2Ygc2hhcmVkIHZhcmlhbmNlIGV4cGxhaW5lZCAodG90YWwgPSAxMDAlKSIKICApCmBgYAoKIyBFRkEKClRvIHRlc3QgSDEsIHdlIHBsYW5uZWQgdG8gY29uZHVjdCBhbiBleHBsb3JhdG9yeSBmYWN0b3IgYW5hbHlzaXMgKEVGQSkgY29sbGFwc2luZyBhY3Jvc3MgYWxsIDEzIHRhcmdldCBjaGFyYWN0ZXJzIChhbmQgdHJlYXRpbmcgYW4gaW5kaXZpZHVhbCBwYXJ0aWNpcGFudCdzIHJlc3BvbnNlcyB0byBlYWNoIGNoYXJhY3RlciBhcyBpZiB0aGV5IHdlcmUgaW5kZXBlbmRlbnQgZGF0YSBwb2ludHMpIC0gc2VlIHRoZSBwcmVyZWdpc3RyYXRpb24gZm9yIG1vcmUgZGV0YWlscy4gIAoKQXMgd2l0aCBTdHVkeSAxLCB3ZSBwbGFubmVkIHRvIGV4YW1pbmUgdGhyZWUgZmFjdG9yIHJldGVudGlvbiBwcm90b2NvbHMgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluOiBQYXJhbGxlbCBhbmFseXNpcywgbWluaW1pemluZyBCSUMsIGFuZCBhIHNldCBvZiBwcmVzZXQgY3JpdGVyaWEgb3V0bGluZWQgaW4gV2Vpc21hbiBldCBhbC4gKDIwMTcpLiBIZXJlIHdlIGxvb2sgYXQgZWFjaCBzb2x1dGlvbiBpbiB0dXJuLgoKV2UgcHJlZGljdGVkIHRoYXQgd2UnZCBzZWUgYSBzaW1pbGFyIGZhY3RvciBzdHJ1Y3R1cmUgdG8gdGhhdCBmb3VuZCBpbiBTdHVkeSAxLgoKCiMjIFJvdGF0aW9uIGNob2ljZXMKCldlIHBsYW5uZWQgdG8gZXhhbWluZSBvYmxpbWluLXJvdGF0ZWQgc29sdXRpb25zICh3aGljaCBhbGxvdyBmYWN0b3JzIHRvIGNvcnJlbGF0ZSksIGJ1dCB5b3UgY291bGQgZXhhbWluZSBvdGhlciByb3RhdGlvbiBvcHRpb25zIGJ5IHNlbGVjdGluZyBhIGRpZmZlcmVudCByb3RhdGlvbiB0eXBlIGhlcmUuCgpgYGB7cn0KY2hvc2VuX3JvdCA8LSAib2JsaW1pbiIgIyBwcmVyZWdpc3RlcmVkOiBmYWN0b3JzIGFsbG93ZWQgdG8gY29ycmVsYXRlCiMgY2hvc2VuX3JvdCA8LSAidmFyaW1heCIgIyBvcnRob2dvbmFsOiBmYWN0b3JzIGZvcmNlZCBub3QgdG8gY29ycmVsYXRlCiMgY2hvc2VuX3JvdCA8LSAibm9uZSIgIyBubyByb3RhdGlvbgpgYGAKCgojIyBQYXJhbGxlbCBhbmFseXNpcwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuX2FsbF9QQSA8LSBmYS5wYXJhbGxlbChkX2FsbCwgcGxvdCA9IEYpOyByZXRlbl9hbGxfUEEKcmV0ZW5fYWxsX3BhciA8LSByZXRlbl9hbGxfUEEkbmZhY3QKYGBgCgojIyMgV2hhdCBhcmUgdGhlc2UgZmFjdG9ycz8KCmBgYHtyfQplZmFfYWxsX3BhciA8LSBmYShkX2FsbCwgbmZhY3RvcnMgPSByZXRlbl9hbGxfcGFyLCByb3RhdGUgPSBjaG9zZW5fcm90LAogICAgICAgICAgICAgICAgICBzY29yZXMgPSAidGVuQmVyZ2UiLCBpbXB1dGUgPSAibWVkaWFuIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuN30KaGVhdG1hcF9mdW4oZWZhX2FsbF9wYXIpICsgCiAgbGFicygKICAgIHRpdGxlID0gcGFzdGUwKCJQYXJhbGxlbCBBbmFseXNpcyAocm90YXRpb246ICIsIGNob3Nlbl9yb3QsICIpIiksCiAgICBzdWJ0aXRsZSA9ICInJSB2YXIuJyBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBzaGFyZWQgdmFyaWFuY2UgZXhwbGFpbmVkICh0b3RhbCA9IDEwMCUpIgogICkKYGBgCgpUaGVzZSBmYWN0b3JzIGxvb2sgZXh0cmVtZWx5IHNpbWlsYXIgdG8gd2hhdCB3ZSBzYXcgaW4gU3R1ZHkgMSAoc2VlIGFib3ZlKS4gSSAoS2FyYSkgd291bGQgc2F5IHRoYXQgSDEgaXMgc3Ryb25nbHkgc3VwcG9ydGVkLgoKCiMjIyBXaGljaCBjYXBhY2l0aWVzIGFyZSBhdHRyaWJ1dGVkIHRvIHdoaWNoIHRhcmdldHM/CgpXZSBjb3VsZCBsb29rIGF0IGZhY3RvciBzY29yZXMgdXNpbmcgdGhlIFN0dWR5IDIgRUZBIHRvIHNlZSB3aGljaCBjYXBhY2l0aWVzIHdlcmUgYXR0cmlidXRlZCB0byB3aGljaCB0YXJnZXRzLiBUaGlzIGlzIG5vdCB0aGUgcHJpbWFyeSB3YXkgd2UgcGxhbm5lZCB0byBpbnZlc3RpZ2F0ZSB0aGlzIC0gdGhpcyB3YXMgbGlzdGVkIGFzIGEgImZvbGxvdy11cCBhbmFseXNpcyIgLSBidXQgSSdtIHB1dHRpbmcgaXQgaGVyZSBzbyB0aGF0IGl0J3MgaW4gY2xvc2UgcHJveGltaXR5IHRvIHRoZSBFRkEgcmVzdWx0cyBmb3IgZWFzZSBvZiBpbnRlcnByZXRhdGlvbi4KCiMjIyMgQWdlIGFzIG51bWVyaWMgKHJhdykKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX3BhciwgdGFyZ2V0ID0gImFsbCAoc3R1ZHkgMikiLCAKICAgICAgICAgICAgICAgdGFyZ2V0X2VuY29kaW5nID0gIm51bWVyaWMiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgMTIpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKIyMjIyBBZ2UgYXMgbnVtZXJpYyAoc3F1YXJlLXJvb3QtdHJhbnNmb3JtZWQpCgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuNX0Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9wYXIsIHRhcmdldCA9ICJhbGwgKHN0dWR5IDIpIiwgCiAgICAgICAgICAgICAgIHRhcmdldF9lbmNvZGluZyA9ICJudW1lcmljIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgNjAsIDEyKSwgdHJhbnMgPSAic3FydCIpICsKICBsYWJzKHRpdGxlID0gIlBhcmFsbGVsIEFuYWx5c2lzIiwgCiAgICAgICB4ID0gImFnZSBhZnRlciBzcXVhcmUtcm9vdCB0cmFuc2Zvcm1hdGlvbiAobW9udGhzKSIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKCiMjIyMgQWdlIGFzIG9yZGluYWwKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC41fQpzY29yZXNwbG90X2Z1bihlZmFfYWxsX3BhciwgdGFyZ2V0ID0gImFsbCAoc3R1ZHkgMikiLCAKICAgICAgICAgICAgICAgdGFyZ2V0X2VuY29kaW5nID0gIm9yZGluYWwiKSArCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIsIAogICAgICAgeCA9ICJhZ2UgKG9yZGluYWwpIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKYGBgCgoKQW5kIGhlcmUncyBhIGNsb3NlIGxvb2sgYXQgYWxsIG9mIHRoZSByYXcgZGF0YSAoY29sb3ItY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBTdHVkeSAyIEVGQSByZXN1bHRzKToKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMC40fQppdGVtc3Bsb3RfZnVuKGVmYV9hbGxfcGFyLCB0YXJnZXQgPSAiYWxsIChzdHVkeSAyKSIpICsgCiAgbGFicyh0aXRsZSA9ICJQYXJhbGxlbCBBbmFseXNpcyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjd9CmRfYWxsICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWRfdGFyZ2V0IikgJT4lCiAgbXV0YXRlKHN1YmlkID0gZ3N1YigiXy4qJCIsICIiLCBzdWJpZF90YXJnZXQpLAogICAgICAgICB0YXJnZXQgPSBnc3ViKCJeLipfIiwgIiIsIHN1YmlkX3RhcmdldCksCiAgICAgICAgIHRhcmdldF9udW0gPSByZWNvZGUodGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMG1vIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDBYbW8iID0gNC8zMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDFtbyIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMm1vIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA0bW8iID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDZtbyIgPSA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwOW1vIiA9IDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDEybW8iID0gMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDE4bW8iID0gMTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDI0bW8iID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDM2bW8iID0gMzYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDQ4bW8iID0gNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDYwbW8iID0gNjApLAogICAgICAgICB0YXJnZXRfb3JkID0gcmVjb2RlX2ZhY3Rvcih0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMG1vIiA9ICJuZXdib3JucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwWG1vIiA9ICI0LWRheS1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAxbW8iID0gIjEtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMm1vIiA9ICIyLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDRtbyIgPSAiNC1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA2bW8iID0gIjYtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwOW1vIiA9ICI5LW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MTJtbyIgPSAiMTItbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxOG1vIiA9ICIxOC1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDI0bW8iID0gIjIteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDM2bW8iID0gIjMteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDQ4bW8iID0gIjQteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDYwbW8iID0gIjUteWVhci1vbGRzIikpICU+JQogIHNlbGVjdCgtYyhzdWJpZF90YXJnZXQsIHRhcmdldCkpICU+JQogIGdhdGhlcihjYXBhY2l0eSwgcmVzcG9uc2UsIC1jKHN1YmlkLCBzdGFydHNfd2l0aCgidGFyZ2V0IikpKSAlPiUKICBmdWxsX2pvaW4oZWZhX2FsbF9wYXIkbG9hZGluZ3NbXSAlPiUKICAgICAgICAgICAgICBkYXRhLmZyYW1lKCkgJT4lCiAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJjYXBhY2l0eSIpICU+JQogICAgICAgICAgICAgIGdhdGhlcihmYWN0b3IsIGxvYWRpbmcsIC1jYXBhY2l0eSkgJT4lCiAgICAgICAgICAgICAgZ3JvdXBfYnkoY2FwYWNpdHkpICU+JQogICAgICAgICAgICAgIHRvcF9uKDEsIGFicyhsb2FkaW5nKSkgJT4lCiAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgIGFycmFuZ2UoZmFjdG9yLCBkZXNjKGFicyhsb2FkaW5nKSkpICU+JQogICAgICAgICAgICAgIG11dGF0ZShvcmRlciA9IDE6MjApICU+JQogICAgICAgICAgICAgIHNlbGVjdChjYXBhY2l0eSwgZmFjdG9yLCBvcmRlcikpICU+JQogICMgZ2dwbG90KGFlcyh4ID0gdGFyZ2V0X29yZCwgeSA9IHJlc3BvbnNlLCBjb2xvciA9IGZhY3RvcikpICsKICBnZ3Bsb3QoYWVzKHggPSB0YXJnZXRfbnVtLCB5ID0gcmVzcG9uc2UsIGNvbG9yID0gZmFjdG9yKSkgKwogIGZhY2V0X3dyYXAofiByZW9yZGVyKGNhcGFjaXR5LCBvcmRlcikpICsKICBnZW9tX2xpbmUoYWVzKGdyb3VwID0gc3ViaWQpLCBhbHBoYSA9IDAuMSkgKwogIGdlb21fc21vb3RoKGFlcyhncm91cCA9IGNhcGFjaXR5KSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBmb3JtdWxhID0gInkgfiBwb2x5KHgsIDMpIiwKICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIiwgZ3VpZGUgPSAibm9uZSIpICsKICAjIHNjYWxlX3hfZGlzY3JldGUoInRhcmdldCBhZ2UgKG9yZGluYWwpIikgKwogIHNjYWxlX3hfY29udGludW91cygidGFyZ2V0IGFnZSAobW9udGhzKSIsIGJyZWFrcyA9IHNlcSgwLCA2MCwgMTIpKSArCiAgIyBzY2FsZV94X2NvbnRpbnVvdXMoImFnZSBhZnRlciBzcXVhcmUtcm9vdCB0cmFuc2Zvcm1hdGlvbiAobW9udGhzKSIsIAogICMgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IHNlcSgwLCA2MCwgMTIpLCB0cmFucyA9ICJzcXJ0IikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSkpKQpgYGAKCgojIyBNaW5pbWl6aW5nIEJJQwoKIyMjIEhvdyBtYW55IGZhY3RvcnMgdG8gcmV0YWluPwoKYGBge3J9CnJldGVuX2FsbF92c3MgPC0gVlNTKGRfYWxsLCBwbG90ID0gRik7IHJldGVuX2FsbF92c3MKcmV0ZW5fYWxsX2JpYyA8LSBkYXRhLmZyYW1lKHJldGVuX2FsbF92c3MkdnNzLnN0YXRzICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigibmZhY3RvcnMiKSAlPiUKICB0b3BfbigtMSwgQklDKSAlPiUKICBzZWxlY3QobmZhY3RvcnMpKSRuZmFjdG9ycyAlPiUgYXMubnVtZXJpYygpCmBgYAoKIyMjIFdoYXQgYXJlIHRoZXNlIGZhY3RvcnM/CgpgYGB7cn0KZWZhX2FsbF9iaWMgPC0gZmEoZF9hbGwsIG5mYWN0b3JzID0gcmV0ZW5fYWxsX2JpYywgcm90YXRlID0gY2hvc2VuX3JvdCwKICAgICAgICAgICAgICAgICAgc2NvcmVzID0gInRlbkJlcmdlIiwgaW1wdXRlID0gIm1lZGlhbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjd9CmhlYXRtYXBfZnVuKGVmYV9hbGxfYmljKSArIAogIGxhYnModGl0bGUgPSBwYXN0ZTAoIk1pbmltaXppbmcgQklDIChyb3RhdGlvbjogIiwgY2hvc2VuX3JvdCwgIikiKSwKICAgICAgIHN1YnRpdGxlID0gIiclIHZhci4nIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIHNoYXJlZCB2YXJpYW5jZSBleHBsYWluZWQgKHRvdGFsID0gMTAwJSkiKQpgYGAKCkEgbW9yZSBjb21wbGV4IHBpY3R1cmUsIGJ1dCB0aGUgZmlyc3QgNCBmYWN0b3JzIGxvb2sgc2ltaWxhciB0byB3aGF0IHdlIGdldCB0aHJvdWdoIHBhcmFsbGVsIGFuYWx5c2lzLiAoSSB0aGluayBzb21ldGhpbmcgc2ltaWxhciBoYXBwZW5lZCB3aXRoIFN0dWR5IDEsIGJ1dCB3ZSBzaG91bGQgZ28gYmFjayBhbmQgY29tcGFyZS4pCgojIyMgV2hpY2ggY2FwYWNpdGllcyBhcmUgYXR0cmlidXRlZCB0byB3aGljaCB0YXJnZXRzPwoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjd9CnNjb3Jlc3Bsb3RfZnVuKGVmYV9hbGxfYmljLCB0YXJnZXQgPSAiYWxsIChzdHVkeSAyKSIpICsgCiAgbGFicyh0aXRsZSA9ICJNaW5pbWl6aW5nIEJJQyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCmBgYAoKV2UnbGwgc2tpcCByZWdyZXNzaW9uIGFuYWx5c2VzIGFuZCBvdGhlciBwbG90cyBmb3Igbm93LgoKCiMjIFByZXNldCByZXRlbnRpb24gY3JpdGVyaWEKCiMjIyBIb3cgbWFueSBmYWN0b3JzIHRvIHJldGFpbj8KCmBgYHtyfQpyZXRlbl9hbGxfayA8LSByZXRlbl9mdW4oZF9hbGwsIHJvdF90eXBlID0gY2hvc2VuX3JvdCkKcHJpbnQocGFzdGUoIlByZXNldCBjcml0ZXJpYSBzdWdnZXN0IHJldGFpbmluZyIsIHJldGVuX2FsbF9rLCAiZmFjdG9ycyIpKQpgYGAKClRoaXMgZ2l2ZXMgdGhlIHNhbWUgc29sdXRpb24gYXMgcGFyYWxsZWwgYW5hbHlzaXMgLSA0IGZhY3RvcnMgOikKCgojIFByb2plY3RpbmcgaW50byBTdHVkeSAxIGZhY3RvciBzcGFjZQoKKipJIChLYXJhKSBtYWRlIGEgYmlnIG1pc3Rha2UgaW4gdGhpbmtpbmcgdGhyb3VnaCB0aGlzOiBJIHRob3VnaHQgd2UgY291bGQgcHJvamVjdCBhIDIwLXZhcmlhYmxlIGRhdGFzZXQgaW50byBhIDYwLXZhcmlhYmxlIGRhdGFzZXQgdXNpbmcgdGhlIGBwcmVkaWN0LnBzeWNoKClgIGZ1bmN0aW9uLCBidXQgd2UgY2FuJ3QhKioKCkkndmUgdHJpZWQgdG8gaGFjayB0b2dldGhlciBhIHdheSB0byBkbyB0aGlzLCBieSByZXBsYWNpbmcgYWxsIG1pc3NpbmcgdmFsdWVzIGF0IHJhbmRvbSAoZWl0aGVyIHdpdGhpbiB0aGUgZnVsbCByYW5nZSBvZiB0aGUgc2NhbGUsIG9yIGFyb3VuZCB0aGUgbWlkcG9pbnQsIG9yIG5lYXIgMCkgLSBidXQgSSBoYXZlbid0IGdvdHRlbiBhbnl0aGluZyB0byB3b3JrLiBBcyB5b3UgY2FuIHNlZSBiZWxvdyAocmVwbGFjaW5nIG1pc3NpbmcgdmFsdWVzIGF0IHJhbmRvbSBiZXR3ZWVuIDAtNSksIHlvdSBzZWUgc2xpZ2h0IGluY3JlYXNlcyBhY3Jvc3MgYWxsIGZhY3RvcnMsIGFuZCB0aGUgbW9zdCBkcmFtYXRpYyBpbmNyZWFzZSBmb3IgRmFjdG9yIDQgLSBidXQgSSB0aGluayB0aGlzIGlzIGJlY2F1c2UgdGhhdCBmYWN0b3IgaXMgbGVhc3Qgd2VsbC1kZWZpbmVkIGluIHRoZSBTdHVkeSAxIEVGQSBzb2x1dGlvbj8gIEkgdGhpbmsgd2UgbmVlZCB0byBmb2N1cyBvbiBhbmFseXppbmcgZmFjdG9yIHNjb3JlcyBmcm9tIG91ciBTdHVkeSAyIEVGQS4gSSdtIHNvcnJ5IGZvciB0aGlzIG1pc3Rha2UhCgpgYGB7cn0KZXh0cmFfdmFyIDwtIHJvd25hbWVzKGVmYV9TMSRsb2FkaW5ncylbIXJvd25hbWVzKGVmYV9TMSRsb2FkaW5ncykgJWluJSByb3duYW1lcyhlZmFfYWxsX3BhciRsb2FkaW5ncyldCgp0ZW1wIDwtIGRfYWxsICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKICBtdXRhdGUoYmVpbmdfYWZyYWlkX29mX3NvbWVib2R5ID0gcm91bmQocnVuaWYoMzk1MiwgMCwgNSkpLCAKICAgICAgICAgYmVpbmdfYW5ncnlfYXRfc29tZWJvZHkgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksCiAgICAgICAgIGJlaW5nX2F3YXJlX29mX3RoaW5ncyA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIGJlaW5nX2NvbWZvcnRlZF9ieV9waHlzaWNhbF90b3VjaCA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwKICAgICAgICAgY2FsbWluZ190aGVtc2VsdmVzX2Rvd24gPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksIAogICAgICAgICBkZXRlY3RpbmdfZGFuZ2VyID0gcm91bmQocnVuaWYoMzk1MiwgMCwgNSkpLCAKICAgICAgICAgZmVlbGluZ19hbm5veWVkID0gcm91bmQocnVuaWYoMzk1MiwgMCwgNSkpLCAKICAgICAgICAgZmVlbGluZ19ib3JlZCA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIGZlZWxpbmdfY2FsbSA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwKICAgICAgICAgZmVlbGluZ19jb25mdXNlZCA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIGZlZWxpbmdfZW1iYXJyYXNzZWQgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksIAogICAgICAgICBmZWVsaW5nX2d1aWx0eSA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwKICAgICAgICAgZmVlbGluZ19ob3BlbGVzcyA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIGZlZWxpbmdfbG92ZWQgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksIAogICAgICAgICBmZWVsaW5nX25lZ2xlY3RlZCA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwKICAgICAgICAgZmVlbGluZ19wbGVhc3VyZSA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIGZlZWxpbmdfcHJpZGUgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksIAogICAgICAgICBmZWVsaW5nX3NhZCA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwKICAgICAgICAgZmVlbGluZ19zYWZlID0gcm91bmQocnVuaWYoMzk1MiwgMCwgNSkpLCAKICAgICAgICAgZmVlbGluZ19zY2FyZWQgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksIAogICAgICAgICBmZWVsaW5nX3RleHR1cmVzID0gcm91bmQocnVuaWYoMzk1MiwgMCwgNSkpLAogICAgICAgICBmZWVsaW5nX3RoaXJzdHkgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksIAogICAgICAgICBmZWVsaW5nX3Rvb19ob3Rfb3JfdG9vX2NvbGQgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksCiAgICAgICAgIGZlZWxpbmdfd29ycmllZCA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIGZvY3VzaW5nX29uX2FfZ29hbCA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIGdldHRpbmdfYW5ncnkgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksCiAgICAgICAgIGdldHRpbmdfaHVydF9mZWVsaW5ncyA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIGdldHRpbmdfcGxlYXN1cmVfZnJvbV9tdXNpYyA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwKICAgICAgICAgaGF2aW5nX2dvYWxzID0gcm91bmQocnVuaWYoMzk1MiwgMCwgNSkpLCAKICAgICAgICAgaGF2aW5nX3Rob3VnaHRzID0gcm91bmQocnVuaWYoMzk1MiwgMCwgNSkpLCAKICAgICAgICAgaGF2aW5nX3dhbnRzX2FuZF9kZXNpcmVzID0gcm91bmQocnVuaWYoMzk1MiwgMCwgNSkpLAogICAgICAgICBpbWFnaW5pbmdfdGhpbmdzID0gcm91bmQocnVuaWYoMzk1MiwgMCwgNSkpLCAKICAgICAgICAgbGlzdGVuaW5nX3RvX3NvbWVib2R5ID0gcm91bmQocnVuaWYoMzk1MiwgMCwgNSkpLCAKICAgICAgICAgbWFraW5nX2Nob2ljZXMgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksCiAgICAgICAgIHJlY29nbml6aW5nX290aGVyc19lbW90aW9ucyA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIHJlY29nbml6aW5nX3NvbWVib2R5X2Vsc2UgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSksCiAgICAgICAgIHJlbWVtYmVyaW5nX3RoaW5ncyA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIHNlZWluZyA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwgCiAgICAgICAgIHRoaW5raW5nX2JlZm9yZV90aGV5X2FjdCA9IHJvdW5kKHJ1bmlmKDM5NTIsIDAsIDUpKSwKICAgICAgICAgdW5kZXJzdGFuZGluZ193aGF0X3NvbWVib2R5X2Vsc2VfaXNfdGhpbmtpbmcgPSByb3VuZChydW5pZigzOTUyLCAwLCA1KSkpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKQoKc2NvcmVzX3Byb2plY3QgPC0gcHJlZGljdC5wc3ljaChvYmplY3QgPSBlZmFfUzEsIGRhdGEgPSB0ZW1wKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuYXNwID0gMC43fQpzY29yZXNfcHJvamVjdCAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZF90YXJnZXQiKSAlPiUKICBtdXRhdGUoc3ViaWQgPSBnc3ViKCJfLiokIiwgIiIsIHN1YmlkX3RhcmdldCksCiAgICAgICAgIHRhcmdldCA9IGdzdWIoIl4uKl8iLCAiIiwgc3ViaWRfdGFyZ2V0KSwKICAgICAgICAgdGFyZ2V0X251bSA9IHJlY29kZSh0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAwbW8iID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MFhtbyIgPSByb3VuZCg0LzMwLCAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDFtbyIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMm1vIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA0bW8iID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDZtbyIgPSA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwOW1vIiA9IDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDEybW8iID0gMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDE4bW8iID0gMTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDI0bW8iID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDM2bW8iID0gMzYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDQ4bW8iID0gNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDYwbW8iID0gNjApLAogICAgICAgICB0YXJnZXRfb3JkID0gcmVjb2RlX2ZhY3Rvcih0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMG1vIiA9ICJuZXdib3JucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwWG1vIiA9ICI0LWRheS1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAxbW8iID0gIjEtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMm1vIiA9ICIyLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDRtbyIgPSAiNC1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA2bW8iID0gIjYtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwOW1vIiA9ICI5LW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MTJtbyIgPSAiMTItbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxOG1vIiA9ICIxOC1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDI0bW8iID0gIjIteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDM2bW8iID0gIjMteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDQ4bW8iID0gIjQteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDYwbW8iID0gIjUteWVhci1vbGRzIikpICU+JQogIHNlbGVjdCgtc3ViaWRfdGFyZ2V0KSAlPiUKICBnYXRoZXIoZmFjdG9yLCBzY29yZSwgLWMoc3ViaWQsIHN0YXJ0c193aXRoKCJ0YXJnZXQiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IHRhcmdldF9udW0sIHkgPSBzY29yZSwgY29sb3IgPSBmYWN0b3IpKSArCiAgZmFjZXRfZ3JpZCh+IGZhY3RvcikgKwogIGdlb21fbGluZShhZXMoZ3JvdXAgPSBzdWJpZCksIGFscGhhID0gMC4xKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCA2MCwgMTIpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSAiS2FyYSdzIGF0dGVtcHQgdG8gcHJvamVjdCBpbnRvIHRoZSBTdHVkeSAxIHNwYWNlIiwKICAgICAgIHN1YnRpdGxlID0gIlJlcGxhY2VkIGFsbCBtaXNzaW5nIHZhbHVlcyAoNDAgcGVyIHBhcnRpY2lwYW50KSB3aXRoIGEgcmFuZG9tIGludGVnZXIgYmV0d2VlbiAwLTUiLAogICAgICAgeCA9ICJ0YXJnZXQgYWdlIChtb250aHMpIiwgeSA9ICJmYWN0b3Igc2NvcmUiKQpgYGAKCgoKIyBSZWdyZXNzaW9uIG1vZGVscyBpbiBTdHVkeSAyIGZhY3RvciBzcGFjZQoKSGVyZSdzIGEgbXVsdGlsZXZlbCBsaW5lYXIgcmVncmVzc2lvbiBvbiB0aGVzZSBmYWN0b3Igc2NvcmVzLCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgKGZvciB0YXJnZXQgYW5kIGZhY3RvcikgYnkgcGFydGljaXBhbnQuIFRhcmdldCBpcyBjb2RlZCBhcyBudW1lcmljLCB3aXRoIG9ubHkgdGhlIGxpbmVhciBjb250cmFzdC4KCmBgYHtyfQplZmFfYWxsX3Bhcl9zY29yZXMgPC0gZWZhX2FsbF9wYXIkc2NvcmVzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigic3ViaWQiKSAlPiUKICBtdXRhdGUodGFyZ2V0ID0gZ3N1YigiXi4qX3RhcmdldCIsICJ0YXJnZXQiLCBzdWJpZCksCiAgICAgICAgIFJlc3BvbnNlSWQgPSBnc3ViKCJfdGFyZ2V0LiokIiwgIiIsIHN1YmlkKSwKICAgICAgICAgdGFyZ2V0X251bSA9IHJlY29kZSh0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAwbW8iID0gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MFhtbyIgPSByb3VuZCg0LzMwLCAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDFtbyIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMm1vIiA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA0bW8iID0gNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDZtbyIgPSA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwOW1vIiA9IDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDEybW8iID0gMTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDE4bW8iID0gMTgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDI0bW8iID0gMjQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDM2bW8iID0gMzYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDQ4bW8iID0gNDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDYwbW8iID0gNjApLAogICAgICAgICB0YXJnZXRfb3JkID0gcmVjb2RlX2ZhY3Rvcih0YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMG1vIiA9ICJuZXdib3JucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwWG1vIiA9ICI0LWRheS1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAxbW8iID0gIjEtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMm1vIiA9ICIyLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDRtbyIgPSAiNC1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA2bW8iID0gIjYtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwOW1vIiA9ICI5LW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MTJtbyIgPSAiMTItbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxOG1vIiA9ICIxOC1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDI0bW8iID0gIjIteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDM2bW8iID0gIjMteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDQ4bW8iID0gIjQteWVhci1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDYwbW8iID0gIjUteWVhci1vbGRzIikpICU+JQogIHNlbGVjdCgtc3ViaWQsIC10YXJnZXQpICU+JQogIGdhdGhlcihmYWN0b3IsIHNjb3JlLCAtc3RhcnRzX3dpdGgoInRhcmdldCIpLCAtUmVzcG9uc2VJZCkgJT4lCiAgbXV0YXRlX2F0KHZhcnMoZmFjdG9yKSwgZnVucyhmYWN0b3IpKQoKY29udHJhc3RzKGVmYV9hbGxfcGFyX3Njb3JlcyRmYWN0b3IpIDwtIGNvbnRyLnN1bShyZXRlbl9hbGxfcGFyKQoKIyByX2FsbF9wYXIgPC0gbG1lcihzY29yZSB+IHRhcmdldF9udW0gKiBmYWN0b3IKIyAgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtICsgZmFjdG9yIHwgUmVzcG9uc2VJZCksCiMgICAgICAgICAgICAgICAgICAgZWZhX2FsbF9wYXJfc2NvcmVzKQojIHN1bW1hcnkocl9hbGxfcGFyLCBjb3JyID0gRikKYGBgCgpJZiB3ZSB0cnkgdG8gcnVuIHRoZSBtb2RlbCBhYm92ZSAob3VyIHBsYW5uZWQgYW5hbHlzaXMpLCB3ZSBnZXQgYW4gZXJyb3I6ICJNb2RlbCBpcyBuZWFybHkgdW5pZGVudGlmaWFibGU6IHZlcnkgbGFyZ2UgZWlnZW52YWx1ZS4iIFRoZSBlcnJvciBzdWdnZXN0cyByZXNjYWxpbmcgdmFyaWFibGVzLCB3aGljaCBzb2x2ZXMgdGhlIHByb2JsZW0uIEhlcmUgSSd2ZSByZS1zY2FsZWQgYnkgZGl2aWRlZCBhZ2UgaW4gbW9udGhzIGJ5IDEyLCB0byBnZXQgYWdlIGluIHllYXJzLiAqKkxldCdzIG1ha2Ugc3VyZSB0byB0YWxrIGFib3V0IHRoaXMuKioKCmBgYHtyfQpyX2FsbF9wYXJfcmVzY2FsZWQgPC0gbG1lcihzY29yZSB+IHRhcmdldF9udW0gKiBmYWN0b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGZhY3RvciB8IFJlc3BvbnNlSWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBlZmFfYWxsX3Bhcl9zY29yZXMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSkKc3VtbWFyeShyX2FsbF9wYXJfcmVzY2FsZWQsIGNvcnIgPSBGKQpgYGAKCkFzIHdlIHByZWRpY3RlZCAoSDIpLCB3ZSBzZWUgZHJhbWF0aWMgaW5jcmVhc2VzIGluIG1lbnRhbCBjYXBhY2l0eSBhdHRyaWJ1dGlvbnMgYWNyb3NzIHRoZSBhZ2UgcmFuZ2UgKG1haW4gZWZmZWN0IG9mIGB0YXJnZXRfbnVtYCkuCgpBbmQgYWxzbyBhcyB3ZSBwcmVkaWN0ZWQgKEgxKSwgd2Ugc2VlIGRpZmZlcmVuY2VzIGFjcm9zcyBmYWN0b3JzIGluIHdoZXJlIG5ld2Jvcm5zIGFyZSBwZXJjZWl2ZWQgdG8gc3RhcnQgb2ZmOiBSZWxhdGl2ZSB0byB0aGUgZ3JhbmQgbWVhbiwgbmV3Ym9ybnMgYXJlIHBlcmNlaXZlZCB0byBzdGFydCBvZmYgd2l0aCBtb3JlICJuZWdhdGl2ZSBlbW90aW9ucyIgKGRpc3RyZXNzLCBmcnVzdHJhdGlvbiwgZXRjLjsgbWFpbiBlZmZlY3Qgb2YgYGZhY3RvcjFgKSwgbGVzcy9mZXdlciBjYXBhY2l0aWVzIGluIHRoZSBkb21haW4gb2YgImNvZ25pdGlvbiBhbmQgY29udHJvbCIgKGVtb3Rpb25hbCBjb250cm9sLCBzZWxmIGNvbnRyb2wsIGV0Yy47IG1haW4gZWZmZWN0IG9mIGBmYWN0b3IyYCksIGFuZCByZWxhdGl2ZWx5IG1vcmUgImJvZGlseSBzZW5zYXRpb25zIiAocGFpbiwgZmF0aWd1ZSwgZXRjLjsgbWFpbiBlZmZlY3Qgb2YgYGZhY3RvcjNgKS4gKFdlIGNvdWxkIHJlY29kZSB0aGlzIHRvIGxvb2sgYXQgYGZhY3RvcjRgLCBvciBqdXN0IGV5ZWJhbGwgaXQgZnJvbSB0aGUgcGxvdC4pIEFsc28gYXMgcHJlZGljdGVkLCB3ZSBzZWUgdGhhdCB0aGUgcGVyY2VpdmVkIGNoYW5nZXMgYWNyb3NzIGFnZSB2YXJ5IGRyYW1hdGljYWxseSBhY3Jvc3MgZmFjdG9yczogIm5lZ2F0aXZlIGVtb3Rpb25zIiBhcmUgcGVyY2VpdmVkIHRvIGNoYW5nZSByZWxhdGl2ZWx5IGxlc3Mgb3ZlciBkZXZlbG9wbWVudCwgImNvZ25pdGlvbiBhbmQgY29udHJvbCIgYXJlIHBlcmNlaXZlZCB0byBjaGFuZ2UgbXVjaCBtb3JlIG92ZXIgZGV2ZWxvcG1lbnQsIGFuZCAiYm9kaWx5IHNlbnNhdGlvbnMiIGFyZSBwcmVkaWN0ZWQgdG8gY2hhZ25lIHJlbGF0aXZlbHkgbGVzcy4KClRoaXMgaXMgYWxsIHZlcnkgbXVjaCBpbiBsaW5lIHdpdGggb3VyIHByZXJlZ2lzdGVyZWQgaHlwb3RoZXNlcyA6KQoKTm93IGxldCdzIHNlZSB3aGF0IHRoZSBwb2x5bm9taWFsIGVmZmVjdHMgbG9vayBsaWtlIChhZ2FpbiwgbG9va2luZyBhdCBhZ2UgaW4geWVhcnMgaW5zdGVhZCBvZiBtb250aHMpLiBBcyB3ZSBleHBlY3RlZCwgaW5jbHVkaW5nIGFsbCBvZiB0aGUgcG9seW5vbWlhbCBlZmZlY3RzIGFzIHJhbmRvbSBzbG9wZXMgY2F1c2VkIHRoZSBtb2RlbCBub3QgdG8gY29udmVyZ2UgKEkgdGhpbmsgd2UgbXVzdCBiZSBjYWxjdWxhdGluZyBkZiB3cm9uZyksIHNvIEkgaW1wbGVtZW50ZWQgb3VyIHByZXJlZ2lzdGVyZWQgcmVtZWR5IGFuZCBpbmNsdWRlZCBvbmx5IHRoZSBsaW5lYXIgZWZmZWN0IGFzIGEgcmFuZG9tIHNsb3BlLgoKYGBge3J9CiMgYWRkaW5nIHBvbHlub21pYWwgZWZmZWN0cwpyX2FsbF9wYXJfcG9seSA8LSBsbWVyKHNjb3JlIH4gcG9seSh0YXJnZXRfbnVtLCAzKSAqIGZhY3RvcgogICAgICAgICAgICAgICAgICAgICAgICsgKHBvbHkodGFyZ2V0X251bSwgMSkgKyBmYWN0b3IgfCBSZXNwb25zZUlkKSwKICAgICAgICAgICAgICAgICAgICAgICBlZmFfYWxsX3Bhcl9zY29yZXMgJT4lCiAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpKQpzdW1tYXJ5KHJfYWxsX3Bhcl9wb2x5LCBjb3JyID0gRikKYGBgCgpMb3RzIHRvIHNpZnQgdGhyb3VnaCBoZXJlLCBidXQgaW4gZ2VuZXJhbCB3ZSBzZWUgdGhhdCB0aGUgZWZmZWN0IG9mIHRhcmdldCBhZ2Ugb24gbWVudGFsIGNhcGFjaXR5IGF0dHJpYnV0aW9ucyBkZWZpbml0ZWx5IGhhcyBsaW5lYXIsIHF1YWRyYXRpYywgYW5kIGN1YmljIGNvbXBvbmVudHMsIGFsbCB0aHJlZSBvZiB3aGljaCBzZWVtIHRvIHZhcnkgc3Vic3RhbnRpYWxseSBhY3Jvc3MgZmFjdG9ycy4gUHJldHR5IG11Y2ggYWxsIG9mIHRoZXNlIGRpZmZlcmVuY2VzIGFyZSAic2lnbmlmaWNhbnQiIChpZiB5b3UgY29uc2lkZXIgfHR8ID4gMiB0byBiZSAic2lnbmlmaWNhbnQiKSAtIGZvciBpbnRlcnByZXRhdGlvbiwgSSB3b3VsZCBuZWVkIHRvIGxvb2sgY2xvc2VyIGF0IHRoZSBwbG90LiBMZXQncyBwdWxsIGl0IHVwIGFnYWluIGhlcmUsIHdpdGggYmx1ZSBsaW5lcyBhcHByb3hpbWF0aW5nIHRoZSBmb3JtdWxhIGB5IH4gcG9seSh4LCAzKWA6CgpgYGB7ciwgZmlnLndpZHRoID0gNCwgZmlnLmFzcCA9IDAuN30Kc2NvcmVzcGxvdF9mdW4oZWZhX2FsbF9wYXIsIHRhcmdldCA9ICJhbGwgKHN0dWR5IDIpIiwgCiAgICAgICAgICAgICAgIHRhcmdldF9lbmNvZGluZyA9ICJudW1lcmljIikgKwogIHNjYWxlX3hfY29udGludW91cygiYWdlIChtb250aHMpIiwgYnJlYWtzID0gc2VxKDAsIDYwLCAxMikpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBmb3JtdWxhID0gInkgfiBwb2x5KHgsIDMpIiwKICAgICAgICAgICAgICBjb2xvciA9ICJibHVlIiwgc2l6ZSA9IDIpCmBgYAoKV2UgY2FuIHRhbGsgdGhyb3VnaCB0aGVzZSBpbnRlcnByZXRhdGlvbnMgdG9nZXRoZXIgLSBidXQgSSBmaW5kIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gRmFjdG9yIDIgKCJjb2duaXRpb24gJiBjb250cm9sIikgYW5kIEZhY3RvciA0ICgicG9zaXRpdmUgZW1vdGlvbnMiKSB0byBiZSBlc3BlY2lhbGx5IGludGVyZXN0aW5nIQoKCiMgRGVtb2dyYXBoaWNzCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gRHVyYXRpb24vNjApKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMikgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IG1lZGlhbihkX2RlbW8kRHVyYXRpb24vNjApLCBjb2xvciA9ICJibHVlIiwgbHR5ID0gMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAsIDQpKSArCiAgbGFicyh0aXRsZSA9ICJEdXJhdGlvbiBvZiBzdHVkeSAoYWNjb3JkaW5nIHRvIFF1YWx0cmljcykiLAogICAgICAgc3VidGl0bGUgPSAiQmx1ZSBkb3R0ZWQgbGluZSBtYXJrcyBtZWRpYW4iLAogICAgICAgeCA9ICJEdXJhdGlvbiAoaW4gbWludXRlcykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBEdXJhdGlvbikgJT4lCiAgbXV0YXRlKER1cmF0aW9uID0gRHVyYXRpb24vNjApICU+JQogIHN1bW1hcmlzZShtZWRpYW4gPSBtZWRpYW4oRHVyYXRpb24pLAogICAgICAgICAgICBtZWFuID0gbWVhbihEdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgc2QgPSBzZChEdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWluID0gbWluKER1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBtYXggPSBtYXgoRHVyYXRpb24sIG5hLnJtID0gVCkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEFnZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRfZGVtbyRBZ2UpLCBjb2xvciA9ICJibHVlIiwgbHR5ID0gMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAsIDQpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBhZ2UgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHN1YnRpdGxlID0gIkJsdWUgZG90dGVkIGxpbmUgbWFya3MgbWVkaWFuIiwKICAgICAgIHggPSAiQWdlIChpbiB5ZWFycykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBBZ2UpICU+JQogIHN1bW1hcmlzZShtZWRpYW4gPSBtZWRpYW4oQWdlKSwKICAgICAgICAgICAgbWVhbiA9IG1lYW4oQWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBzZCA9IHNkKEFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWluID0gbWluKEFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWF4ID0gbWF4KEFnZSwgbmEucm0gPSBUKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gR2VuZGVyU2V4KSkgKyAKICBnZW9tX2JhcigpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGdlbmRlci9zZXggKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiR2VuZGVyL3NleCIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KZF9kZW1vICU+JQogIGRpc3RpbmN0KFJlc3BvbnNlSWQsIEdlbmRlclNleCkgJT4lCiAgY291bnQoR2VuZGVyU2V4KSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4sIG5hLnJtID0gVCksIDIpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBnc3ViKCcoLnsxLDMwfSkoXFxzfCQpJywgJ1xcMVxuJywgUmFjZUV0aG5pY2l0eV9jb2xsYXBzZSkpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgcmFjZS9ldGhuaWNpdHkgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiUmFjZS9ldGhuaWNpdHkiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBSYWNlRXRobmljaXR5X2NvbGxhcHNlKSAlPiUKICBjb3VudChSYWNlRXRobmljaXR5X2NvbGxhcHNlKSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4sIG5hLnJtID0gVCksIDIpKSAlPiUKICBhcnJhbmdlKGRlc2MobikpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEZpcnN0TGFuZykpICsgCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBmaXJzdCBsYW5ndWFnZSAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJMYW5ndWFnZSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KZF9kZW1vICU+JQogIGRpc3RpbmN0KFJlc3BvbnNlSWQsIEZpcnN0TGFuZykgJT4lCiAgY291bnQoRmlyc3RMYW5nKSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4sIG5hLnJtID0gVCksIDIpKSAlPiUKICBhcnJhbmdlKGRlc2MobikpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IGZhY3RvcihFZHVjYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGxldmVscyhkJEVkdWNhdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGdzdWIoJyguezEsMzB9KShcXHN8JCknLCAnXFwxXG4nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMoZCRFZHVjYXRpb24pKSkpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgZWR1Y2F0aW9uYWwgYXR0YWlubWVudCAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJIaWdoZXN0IGxldmVsIG9mIGVkdWNhdGlvbiBjb21wbGV0ZWQiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBFZHVjYXRpb24pICU+JQogIGNvdW50KEVkdWNhdGlvbikgJT4lCiAgbXV0YXRlKHByb3AgPSByb3VuZChuL3N1bShuLCBuYS5ybSA9IFQpLCAyKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gSW5jb21lKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGhvdXNlaG9sZCBpbmNvbWUgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiQW5udWFsIGhvdXNlaG9sZCBpbmNvbWUiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBJbmNvbWUpICU+JQogIGNvdW50KEluY29tZSkgJT4lCiAgbXV0YXRlKHByb3AgPSByb3VuZChuL3N1bShuLCBuYS5ybSA9IFQpLCAyKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gSG91c2Vob2xkU2l6ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRfZGVtbyRIb3VzZWhvbGRTaXplKSwgY29sb3IgPSAiYmx1ZSIsIGx0eSA9IDIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwLCAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgaG91c2Vob2xkIHNpemUgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHN1YnRpdGxlID0gIkJsdWUgZG90dGVkIGxpbmUgbWFya3MgbWVkaWFuIiwKICAgICAgIHggPSAiTnVtYmVyIG9mIHBlb3BsZSBpbiBob3VzZWhvbGQgKGFkdWx0cyBhbmQgY2hpbGRyZW4pIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQpkX2RlbW8gJT4lCiAgZGlzdGluY3QoUmVzcG9uc2VJZCwgSG91c2Vob2xkU2l6ZSkgJT4lCiAgc3VtbWFyaXNlKG1lZGlhbiA9IG1lZGlhbihIb3VzZWhvbGRTaXplKSwKICAgICAgICAgICAgbWVhbiA9IG1lYW4oSG91c2Vob2xkU2l6ZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgc2QgPSBzZChIb3VzZWhvbGRTaXplLCBuYS5ybSA9IFQpLAogICAgICAgICAgICBtaW4gPSBtaW4oSG91c2Vob2xkU2l6ZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgbWF4ID0gbWF4KEhvdXNlaG9sZFNpemUsIG5hLnJtID0gVCkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IE1hcml0YWxTdGF0dXMpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgbWFyaXRhbCBzdGF0dXMgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHggPSAiTWFyaXRhbCBzdGF0dXMiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBNYXJpdGFsU3RhdHVzKSAlPiUKICBjb3VudChNYXJpdGFsU3RhdHVzKSAlPiUKICBtdXRhdGUocHJvcCA9IHJvdW5kKG4vc3VtKG4sIG5hLnJtID0gVCksIDIpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gVH0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBQYXJlbnQpKSArIAogIGdlb21fYmFyKCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgcGFyZW50IHN0YXR1cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgc3VidGl0bGUgPSAiJ05BJyBpbmRpY2F0ZXMgcmVzcG9uc2Ugb2YgJ1ByZWZlciBub3QgdG8gc2F5JyIsCiAgICAgICB4ID0gIlBhcmVudCBzdGF0dXMiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChSZXNwb25zZUlkLCBQYXJlbnQpICU+JQogIGNvdW50KFBhcmVudCkgJT4lCiAgbXV0YXRlKHByb3AgPSByb3VuZChuL3N1bShuLCBuYS5ybSA9IFQpLCAyKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IFR9CmdncGxvdChkX2RlbW8gJT4lIGZpbHRlcihQYXJlbnQgPT0gIlllcyIpLCBhZXMoeCA9IENoaWxkcmVuTnVtYmVyKSkgKyAKICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBtZWRpYW4oZF9kZW1vW2RfZGVtbyRQYXJlbnQgPT0gIlllcyIsXSRDaGlsZHJlbk51bWJlciwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgICBjb2xvciA9ICJibHVlIiwgbHR5ID0gMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAsIDEpKSArCiAgbGFicyh0aXRsZSA9ICJOdW1iZXIgb2YgY2hpbGRyZW4gYW1vbmcgcGFyZW50cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgc3VidGl0bGUgPSAiQmx1ZSBkb3R0ZWQgbGluZSBtYXJrcyBtZWRpYW4iLAogICAgICAgeCA9ICJOdW1iZXIgb2YgY2hpbGRyZW4gKGFtb25nIHBhcmVudHMpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQpnZ3Bsb3QoZF9kZW1vICU+JSBmaWx0ZXIoUGFyZW50ID09ICJZZXMiKSwgCiAgICAgICBhZXMoeCA9IGZhY3RvcihDaGlsZHJlbk9sZGVzdEFnZV9jb2xsYXBzZSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGxldmVscyhkX2RlbW8kQ2hpbGRyZW5PbGRlc3RBZ2VfY29sbGFwc2UpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZ3N1YignKC57MSwzMH0pKFxcc3wkKScsICdcXDFcbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMoZF9kZW1vJENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlKSkpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIkFnZSBvZiBvbGRlc3QgY2hpbGQgYW1vbmcgcGFyZW50cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJBZ2Ugb2YgY2hpbGQgaW4geWVhcnMgKGFtb25nIHBhcmVudHMpIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBUfQpnZ3Bsb3QoZF9kZW1vICU+JSBmaWx0ZXIoUGFyZW50ID09ICJZZXMiKSwgCiAgICAgICBhZXMoeCA9IGZhY3RvcihDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGdzdWIoJyguezEsMzB9KShcXHN8JCknLCAnXFwxXG4nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlKSkpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIkFnZSBvZiB5b3VuZ2VzdCBjaGlsZCBhbW9uZyBwYXJlbnRzIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkFnZSBvZiBjaGlsZCBpbiB5ZWFycyAoYW1vbmcgcGFyZW50cykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgoKCiMgUGxhbm5pbmcgZm9yIFMzIHByZXJlZwoKYGBge3J9CmRfdGVtcCA8LSBkX2FsbCAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lCiAgbXV0YXRlKHRhcmdldCA9IGdzdWIoIl4uKl90YXJnZXQiLCAidGFyZ2V0Iiwgc3ViaWQpLAogICAgICAgICBSZXNwb25zZUlkID0gZ3N1YigiX3RhcmdldC4qJCIsICIiLCBzdWJpZCksCiAgICAgICAgIHRhcmdldF9udW0gPSByZWNvZGUodGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMG1vIiA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDBYbW8iID0gcm91bmQoNC8zMCwgMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDAxbW8iID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDJtbyIgPSAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwNG1vIiA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA2bW8iID0gNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDltbyIgPSA5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxMm1vIiA9IDEyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQxOG1vIiA9IDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQyNG1vIiA9IDI0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQzNm1vIiA9IDM2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ0OG1vIiA9IDQ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ2MG1vIiA9IDYwKSwKICAgICAgICAgdGFyZ2V0X29yZCA9IHJlY29kZV9mYWN0b3IodGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDBtbyIgPSAibmV3Ym9ybnMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MFhtbyIgPSAiNC1kYXktb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwMW1vIiA9ICIxLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDJtbyIgPSAiMi1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDA0bW8iID0gIjQtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQwNm1vIiA9ICI2LW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MDltbyIgPSAiOS1tb250aC1vbGRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDEybW8iID0gIjEyLW1vbnRoLW9sZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0MThtbyIgPSAiMTgtbW9udGgtb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQyNG1vIiA9ICIyLXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQzNm1vIiA9ICIzLXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ0OG1vIiA9ICI0LXllYXItb2xkcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQ2MG1vIiA9ICI1LXllYXItb2xkcyIpKSAlPiUKICBzZWxlY3QoLXN1YmlkLCAtdGFyZ2V0KSAlPiUKICBnYXRoZXIoY2FwYWNpdHksIHJlc3BvbnNlLCAtc3RhcnRzX3dpdGgoInRhcmdldCIpLCAtUmVzcG9uc2VJZCkKYGBgCgpgYGB7cn0KZmFjdG9yc190ZW1wIDwtIGVmYV9hbGxfcGFyJGxvYWRpbmdzW10gJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigiY2FwYWNpdHkiKSAlPiUKICBnYXRoZXIoZmFjdG9yLCBsb2FkaW5nLCAtY2FwYWNpdHkpICU+JQogIGdyb3VwX2J5KGNhcGFjaXR5KSAlPiUKICB0b3BfbigxLCBsb2FkaW5nKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgYXJyYW5nZShmYWN0b3IsIGRlc2MobG9hZGluZykpICU+JQogIG11dGF0ZShvcmRlciA9IDE6bnJvdyguKSkKCmZhY3RvcnNfdGVtcApgYGAKCmBgYHtyfQpjYXBhY2l0aWVzX3MzIDwtIGRhdGEuZnJhbWUoY2FwYWNpdHkgPSBjKCJjb250cm9sbGluZ190aGVpcl9lbW90aW9ucyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYXNvbmluZ19hYm91dF90aGluZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXR0aW5nX2h1bmdyeSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWVsaW5nX3BhaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZWVsaW5nX2hhcHB5IiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlYXJuaW5nX2Zyb21fb3RoZXJfcGVvcGxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmVlbGluZ19kaXN0cmVzc2VkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZlZWxpbmdfaGVscGxlc3MiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9IGMocmVwKCJDT0ciLCAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJCT0QiLCAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJQT1MiLCAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKCJORUciLCAyKSkpICU+JQogIG11dGF0ZShkb21haW4gPSBmYWN0b3IoZG9tYWluKSkKYGBgCgpgYGB7cn0KZF90ZW1wX2N1bGxlZCA8LSBkX3RlbXAgJT4lCiAgZnVsbF9qb2luKGNhcGFjaXRpZXNfczMpICU+JQogIGZ1bGxfam9pbihmYWN0b3JzX3RlbXApICU+JQogIGZpbHRlcighaXMubmEoZG9tYWluKSkgJT4lCiAgZGlzdGluY3QoKQoKIyBkX3RlbXBfY3VsbGVkCmBgYAoKCmBgYHtyfQpjb250cmFzdHMoZF90ZW1wX2N1bGxlZCRkb21haW4pIDwtIGNvbnRyLnN1bShyZXRlbl9hbGxfcGFyKQoKcl90ZW1wIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtICogZG9tYWluCiAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKSAKICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKICAgICAgICAgICAgICAgZF90ZW1wX2N1bGxlZCAlPiUKICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0gLyAxMikpCnN1bW1hcnkocl90ZW1wLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KY29udHJhc3RzKGRfdGVtcF9jdWxsZWQkZG9tYWluKSA8LSBjb250ci5zdW0ocmV0ZW5fYWxsX3BhcikKCnIyX3RlbXAgPC0gbG1lcihyZXNwb25zZSB+IHRhcmdldF9udW0gKiBkb21haW4KICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQogICAgICAgICAgICAgICAgKyAoMSB8IGNhcGFjaXR5KSwKICAgICAgICAgICAgICAgIGRfdGVtcF9jdWxsZWQgJT4lCiAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikpCnN1bW1hcnkocjJfdGVtcCwgY29yciA9IEYpCmBgYAoKYGBge3J9CmNvbnRyYXN0cyhkX3RlbXBfY3VsbGVkJGRvbWFpbikgPC0gY29udHIuc3VtKHJldGVuX2FsbF9wYXIpCgpyM190ZW1wIDwtIGxtZXIoc2NvcmUgfiB0YXJnZXRfbnVtICogZG9tYWluCiAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgUmVzcG9uc2VJZCksCiAgICAgICAgICAgICAgICBkX3RlbXBfY3VsbGVkICU+JQogICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQogICAgICAgICAgICAgICAgICBncm91cF9ieShkb21haW4sIHRhcmdldF9udW0sIFJlc3BvbnNlSWQpICU+JQogICAgICAgICAgICAgICAgICBzdW1tYXJpc2Uoc2NvcmUgPSBtZWFuKHJlc3BvbnNlLCBuYS5ybSA9IFQpKSAlPiUKICAgICAgICAgICAgICAgICAgdW5ncm91cCgpICU+JQogICAgICAgICAgICAgICAgICBkaXN0aW5jdCgpKQpzdW1tYXJ5KHIzX3RlbXAsIGNvcnIgPSBGKQpgYGAKCmBgYHtyfQpjb250cmFzdHMoZF90ZW1wX2N1bGxlZCRkb21haW4pIDwtIGNvbnRyLnN1bShyZXRlbl9hbGxfcGFyKQoKcjRfdGVtcCA8LSBsbWVyKHJlc3BvbnNlIH4gdGFyZ2V0X251bQogICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiAgICAgICAgICAgICAgICArICgxICsgdGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKICAgICAgICAgICAgICAgIGRfdGVtcF9jdWxsZWQgJT4lCiAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIk5FRyIpKQpzdW1tYXJ5KHI0X3RlbXAsIGNvcnIgPSBGKQoKcjVfdGVtcCA8LSBsbWVyKHJlc3BvbnNlIH4gdGFyZ2V0X251bQogICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAogICAgICAgICAgICAgICAgZF90ZW1wX2N1bGxlZCAlPiUKICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiTkVHIikpCnN1bW1hcnkocjVfdGVtcCwgY29yciA9IEYpCmBgYAoKIyBFeHBvcnQgZGF0YSAKKHJlbWVtYmVyIHRvIG1vdmUgcHJpb3IgdG8gcHVzaGluZyB0byBnaXRodWIhKQoKIyMgYWRkaXRpb25hbCBjbGVhbmluZyBvZiByYXcgZGF0YQpgYGB7cn0KZF9hbGwgPC0gCiAgZF9hbGwgJT4lICAKICBkYXRhLmZyYW1lKCkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JSAKICBtdXRhdGUoCiAgICB0YXJnZXQgPSBnc3ViKCJeLipfdGFyZ2V0IiwgInRhcmdldCIsIHN1YmlkKSwKICAgIFJlc3BvbnNlSWQgPSBnc3ViKCJfdGFyZ2V0LiokIiwgIiIsIHN1YmlkKSwKICAgIHRhcmdldF9udW0gPSByZWNvZGUoCiAgICAgIHRhcmdldCwKICAgICAgInRhcmdldDAwbW8iID0gMCwKICAgICAgInRhcmdldDBYbW8iID0gcm91bmQoNC8zMCwgMyksCiAgICAgICJ0YXJnZXQwMW1vIiA9IDEsCiAgICAgICJ0YXJnZXQwMm1vIiA9IDIsCiAgICAgICJ0YXJnZXQwNG1vIiA9IDQsCiAgICAgICJ0YXJnZXQwNm1vIiA9IDYsCiAgICAgICJ0YXJnZXQwOW1vIiA9IDksCiAgICAgICJ0YXJnZXQxMm1vIiA9IDEyLAogICAgICAidGFyZ2V0MThtbyIgPSAxOCwKICAgICAgInRhcmdldDI0bW8iID0gMjQsCiAgICAgICJ0YXJnZXQzNm1vIiA9IDM2LAogICAgICAidGFyZ2V0NDhtbyIgPSA0OCwKICAgICAgInRhcmdldDYwbW8iID0gNjAKICAgICksCiAgICB0YXJnZXRfb3JkID0gcmVjb2RlX2ZhY3RvcigKICAgICAgdGFyZ2V0LAogICAgICAidGFyZ2V0MDBtbyIgPSAibmV3Ym9ybnMiLAogICAgICAidGFyZ2V0MFhtbyIgPSAiNC1kYXktb2xkcyIsCiAgICAgICJ0YXJnZXQwMW1vIiA9ICIxLW1vbnRoLW9sZHMiLAogICAgICAidGFyZ2V0MDJtbyIgPSAiMi1tb250aC1vbGRzIiwKICAgICAgInRhcmdldDA0bW8iID0gIjQtbW9udGgtb2xkcyIsCiAgICAgICJ0YXJnZXQwNm1vIiA9ICI2LW1vbnRoLW9sZHMiLAogICAgICAidGFyZ2V0MDltbyIgPSAiOS1tb250aC1vbGRzIiwKICAgICAgInRhcmdldDEybW8iID0gIjEyLW1vbnRoLW9sZHMiLAogICAgICAidGFyZ2V0MThtbyIgPSAiMTgtbW9udGgtb2xkcyIsCiAgICAgICJ0YXJnZXQyNG1vIiA9ICIyLXllYXItb2xkcyIsCiAgICAgICJ0YXJnZXQzNm1vIiA9ICIzLXllYXItb2xkcyIsCiAgICAgICJ0YXJnZXQ0OG1vIiA9ICI0LXllYXItb2xkcyIsCiAgICAgICJ0YXJnZXQ2MG1vIiA9ICI1LXllYXItb2xkcyIKICAgICkKICApICU+JQogIHNlbGVjdCgtc3ViaWQsIC10YXJnZXQpICU+JQogIGdhdGhlcihpdGVtLCBzY29yZSwgLXN0YXJ0c193aXRoKCJ0YXJnZXQiKSwgLVJlc3BvbnNlSWQpICU+JQogIG11dGF0ZV9hdCh2YXJzKGl0ZW0pLCBmdW5zKGZhY3RvcikpCmBgYAoKCmBgYHtyfQp3cml0ZS5jc3YoZWZhX2FsbF9wYXJfc2NvcmVzLCBmaWxlID0gIi4vczJfc2NvcmVzLmNzdiIpCndyaXRlLmNzdihkX2RlbW8sIGZpbGUgPSAiLi9zMl9kZW1vLmNzdiIpCndyaXRlLmNzdihkX2FsbCwgZmlsZSA9ICIuL3MyX2RhdGEuY3N2IikKYGBgCgo=